package com.generic.extendsandsuper;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Test {

	public static void upperBound(List<? extends Date> list, Date date) {
		Date now = list.get(0);
		System.out.println("now==>" + now);
		// list.add(date); //这句话无法编译
		list.add(null);// 这句可以编译，因为null没有类型信息
	}

	public static void lowerBound(List<? super Timestamp> list) {
		Timestamp now = new Timestamp(System.currentTimeMillis());
		list.add(now);
		// Timestamp time = list.get(0); //不能编译
	}

	public static void main(String[] args) {
		// upperBound方法中实际的list是List<Timestamp>，向它添加一个基类Date类型，由于基类无法转换为子类，所以无法添加。
		// 相反，读取数据时，不管实际的list是什么类型，但可以知道它至少会返回一个Date类型，所以用foreach，get等没有问题。
		List<Timestamp> list = new ArrayList<Timestamp>();
		Date date = new Date();
		upperBound(list, date);

		// 在lowerBound方法中的List<? super Timestamp>表示这个list的参数类型可能是Timestamp或Timestamp的父类，如后面的代码里，实际传入的是一个List<Date>类型。
		// List<Date>中可以添加一个Timestamp对象，但list.get()方法返回的对象类型可能是Date甚至是Object，不能安全的向下转换到Timestamp，也就因此无法编译了。
		List<Date> list2 = new ArrayList<Date>();
		list2.add(new Date());
		lowerBound(list);
	}

}
